﻿using System;
using System.Web;
using System.Web.UI;
using System.Threading;
using System.Reflection;

using SimpleService.Config;

namespace SimpleService.MVC
{
    public class Service : Page
    {
        public virtual void Page_Load(object sender, EventArgs e)
        {

            //這一段 可使 網頁每次被讀取時 均能重新更新
            Response.Expires = 0;
            Response.AppendHeader("pragma", "no-cache");
            Response.Cache.SetNoStore();

            //若是惡意隱碼攻擊
            if (!MvcUtility.IsSafeRequest(Page))
            {
                //過濾後重新導向
                string reurl = "default.aspx?";
                foreach (string var in Request.QueryString)
                {
                    reurl = reurl + var + "=" + MvcUtility.CleanInput(Request.QueryString[var]) + "&";

                } //end foreach
                Response.Redirect(reurl);

            }

            string accessPage = Request["page"];
            
            string accessNamespace = Request["n"]; //namespace	

            if (MvcUtility.IsNull(accessPage)) accessPage = MvcConfig.defaultPage;
            if (MvcUtility.IsNull(accessNamespace)) accessNamespace = MvcConfig.defaultNamespace;

            GoPage(sender, e, accessPage, accessNamespace);

        }

        private void GoPage(Object source, EventArgs e, string pageName, string namespaceName)
        {
            try
            {

                //MvcConfig.templatePath = this.Server.MapPath(".") + MvcConfig.templatePath;
                //MvcConfig.DBPath = this.Server.MapPath(".");

                //底下 這種方式的 關鍵 語法
                //利用 Type.GetType() 和 Activator.CreateInstance 兩個方式，直接利用 動態取得的 類別名 來建立該類別的物件
                //請注意，當 namespace 修改時，記得同時要修改 Type.GetType("CYU.ServiceSample." + accessPage, true) 中的 "CYU.ServiceSample." 
               // Type theType = Type.GetType("SimpleService" + "." + namespaceName + "." + pageName, true);
                //Type theType = Assembly.Load("SimpleService" + "." + namespaceName).GetType("SimpleService" + "." + namespaceName+"."+pageName, true);
                Type theType = System.Reflection.Assembly.Load("App_Code").GetType("SimpleService" + "." + namespaceName + "." + pageName, true);
                //BasePage p = (BasePage)Activator.CreateInstance(theType);    //建立 theType 的一個物件
                BasePageController p = (BasePageController)Activator.CreateInstance(theType);    //建立 theType 的一個物件

                

                

                p.InitPage(Page);
                p.Page_Load(source, e);

            }
            catch (TypeLoadException ex)   //此處只攔截 TypeLoadException
            {
                //TODO:改樣板
                Response.Write("<font color=red>網址錯誤，欲存取的頁面不存在!!</font><br>輸入的頁面名為：" + pageName);
                Response.Write("<br/>若您操作無誤，且持續出現本訊息，請快照本頁面，並聯繫系統維護者處理。<br/><br/>");
                Response.Write("<br/>Url=" + Request.Url);
                Response.Write("<br/>UserHostAddress=" + Request.UserHostAddress);
                Response.Write("<br/>UserHostName=" + Request.UserHostName);
                Response.Write("<br/>DateTime=" + DateTime.Now.ToString());

                if (Request.IsLocal)
                {
                    Response.Write("<br>更多訊息：<br>" + "<pre>" + ex.ToString() + "</pre>");
                }
            }
            catch (ThreadAbortException ex)
            {
                //不處理   //這部份 通常是 因為 redirect 造成
            }
            catch (Exception ex)    //此處攔截 其他的 Exception
            {

                Response.Write("頁面處理發生異常!!<br>輸入的頁面名為：" + pageName);
                Response.Write("<br>page=" + Request["page"]);

                if (Request.IsLocal)
                {

                    Response.Write("<br>更多訊息：<br>" + "<pre>" + ex.ToString() + "</pre>");

                }
                //throw ex;
            }
        }
    }
}
